package com.chenjt.jvm.first.ten_GC;

import java.lang.ref.SoftReference;

/**
 * 注释：
 * 软引用测试：内存不足即回收
 * -Xmx10M -Xmx10M
 *
 * @author chenjt
 * @date 2025/6/17 9:14
 */
public class SoftReferenceTest {

    public static class User{
        public User(int id,String name){
            this.id = id;
            this.name = name;
        }

        public int id;
        public String name;

        @Override
        public String toString() {
            return "[id=" + id + ",name=" + name + "]";
        }
    }


    public static void main(String[] args) {
        // 创建对象，建立软引用
        SoftReference<User> userSoftRef = new SoftReference<>(new User(1, "chenjt"));
        // 上面的一行代码，等价于如下的三行代码
//        User u1 = new User(1, "chenjt");
//        SoftReference<User> userSoftRef = new SoftReference<>(u1);
//        u1 = null;// 取消强引用


        // 从软引用中重新获得强引用对象
        System.out.println(userSoftRef.get());

        System.gc();
        System.out.println("After GC:");
        // 从垃圾回收之后获得软引用中的对象
        // 由于堆空间内存足够，所以这里不会回收软引用的可达对象
        System.out.println(userSoftRef.get());

        try {
            // 让系统认为内存资源紧张、不够
            byte[] b = new byte[1024*1024*7];
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 再次从软引用中获取数据
            // 在报OOM之前，垃圾回收器会回收软引用中的可达对象
            System.out.println(userSoftRef.get());
        }


    }


}
